// 规则示例：
// mobile: [
//   {required: true, message: '请填写姓名'},
//   {pattern: /^1[3-9]\d{9}$/, message: '请填写正确的手机号'}
// ]

/**
 * 基于 checklist 校验数据
 * @param {any} value 要校验的数据，在小程序页面或者组件的 data.xx 上
 * @param {array} list 要校验的项目，对象数组，对象中包含规则和错误提示
 * @returns
 */
function checkList(value, list) {
  // every: 所有项通过才能算通过
  return list.every((item) => {
    // 必填项，但是没有这个数据，或者没有填写
    if (item.required && (value === undefined || value === '')) {
      wx.utils.toast(item.message)
      return false
    }
    // 正则，但是正则校验失败
    if (item.pattern && !item.pattern.test(value + '')) {
      wx.utils.toast(item.message)
      return false
    }
    // 支持 min max 校验：假设 value 都是字符串，value 可能是数字的情况自己解决
    // 字符串长度小于最小值，或者长度大于最大值，校验不通过
    if ((item.min && value.length < item.min) || (item.max && item.length > item.max)) {
      wx.utils.toast(item.message)
      return false
    }
    // ...
    // ...
    // 其他规则可以自行补充
    // 优化点：支持的规则可以函数化，通过循环的方式批量校验
    // ...
    // ...
    return true
  })
}

export default Behavior({
  methods: {
    validate() {
      // 如果没有定义规则，直接放过
      if (!this.rules) return true
      // 遍历规则，对每一个 data 字段进行校验
      for (let key in this.rules) {
        // key 是要校验的数据的名字
        // this.rules[key] 是对这个数据的校验项，是一个数组，checklist
        // 如果校验失败，直接返回false
        if (!checkList(this.data[key], this.rules[key])) {
          return false
        }
      }
      return true
    },
  },
})
